perm filename DB.LSP[C,JRA]1 blob sn#012876 filedate 1972-11-15 generic text, type T, neo UTF8
00100	(GLOBAL 
00200	   (FUNCTIONS IN-CONTEXT OBJECT CFRAME PUSH-CONTEXT POP-CONTEXT 
00300	      SPLICE FETCHI FETCHM REALIZE UNREALIZE REAL UNREAL  
00400	      ACTUALIZE UNACTUALIZE DPUTCF DGETCF DREMCF DPUT DGET DREM 
00500	      DPUT+ DGET+ DREM+ PRESENT ABSENT DATUM MENTIONERS C-MARKER 
00600	      /!" /!"1 IF-NEEDED IF-ADDED IF-REMOVED DATA-INIT FETCH ADD 
00700	      REMOVE INSERT KILL FLUSH NEW-CONTEXT PATH)
00800	   (RESERVED *CONTEXT DATUM *CFRAME GLOBAL 
00900	      *OBJECT *POSSIBILITIES CONTEXT *ITEM *METHOD *IGNORE))
01000	
01100	
01200	(DECLARE   (SYMBOLS T) (GENPREFIX \D) (GENSYM 'D)
01300	   (SPECIAL CFRAMES CNUM CONTEXT DATUM CMARKERS TYPE PATTERN 
01400	      GLOBAL INCCON NUMACT NUMCON *CNUM
01500	      *IF-ADDEDS *IF-NEEDEDS *IF-REMOVEDS *INDEXTHRESHOLD *ITEMS NEW)
01600	   (*FEXPR /!" CDEFUN CERR CSETQ /: /, 
01700	      GCCON IF-ADDED IF-NEEDED IF-REMOVED)
01800	   (*LEXPR BIND ABSENT ADD CEVAL CFRAME CSET VLOC DGET
01900	      DGET+ DPUT DPUT+ DREM DREM+ FETCH FETCHI
02000	      FETCHM INSERT KILL MATCH NOTE OBJECT POP-CONTEXT PRESENT
02100	      DATA-INIT PUSH-CONTEXT REAL REALIZE REMOVE RVALUE UNREAL
02200	      UNREALIZE)
02300	   (*EXPR ARGS DATUM CMARKERS PATTERN)
02400	   (**ARRAY FRAMES RFRAMES))
02500	
02600	(SETQ *INDEXTHRESHOLD 10.)(DEFUN OBJECT N
02700	   (LIST '*OBJECT (COND ((= N 0) NIL)
02800	                        ((= N 1) (ARG 1))
02900	                        ((TMA))   ))   )
03000	
03100	(DEFUN TMA ()
03200	   (CERR TOO MANY ARGUMENTS)   )
03300	
03400	(DEFUN TFA ()
03500	   (CERR TOO FEW ARGUMENTS)   )
03600	
03700	(DECLARE (UNSPECIAL CMARKERS TYPE))
03800	
03900	(DEFUN MAKE-METHOD (TYPE BOD)
04000	   (PROG (FIRST OLDM CMARKERS)
04100	      (COND ((ATOM (SETQ FIRST (CAR BOD)))
04200	             (SETQ CMARKERS
04300	                   (COND ((SETQ OLDM (GET FIRST 'DATUM))
04400	                          (CDR (CMARKERS OLDM)))   ))
04500	             (PUTPROP FIRST 
04600	                      (NCONC (LIST TYPE FIRST (CADR BOD) (CDDR BOD))
04700	                             CMARKERS)
04800	                      'DATUM)
04900	             (RETURN FIRST))
05000	            ((RETURN (LIST TYPE NIL FIRST (CDR BOD))))   )   ))
05100	
05200	(DECLARE (SPECIAL CMARKERS TYPE))
05300	
05400	
05500	(DEFUN IF-NEEDED FEXPR (A)
05600	   (MAKE-METHOD 'IF-NEEDED A))
05700	
05800	
05900	(DEFUN IF-ADDED FEXPR (A)
06000	   (MAKE-METHOD 'IF-ADDED A))
06100	
06200	
06300	(DEFUN IF-REMOVED FEXPR (A)
06400	   (MAKE-METHOD 'IF-REMOVED A))
06500	
06600	
     

00100	(DEFUN DATA-INIT K
00200	 ((LAMBDA (N M)
00300	   (PI-OFF)
00400	   (COND ((BOUNDP 'NUMACT)
00500	          (DO I 0 (ADD1 I) (= I NUMACT)
00600	             (DO DATA (CDDR (FRAMES I)) (CDR DATA) (NULL DATA)
00700	                ((LAMBDA (D)
00800	                    (AND (ATOM D) (RPLACD (CMARKERS D) NIL)))
00900	                 (CAR DATA))   ))))
01000	   (SETQ NUMCON N INCCON M)
01100	   (ARRAY FRAMES T NUMCON)
01200	   (ARRAY RFRAMES T NUMCON)
01300	   (STORE (FRAMES 0) (LIST '*CFRAME (SETQ *CNUM 0)))
01400	   (STORE (RFRAMES 0) (CDR (FRAMES 0)))
01500	   (CSETQ CONTEXT (CSETQ GLOBAL (LIST '*CONTEXT (FRAMES 0))))
01600	   (SETQ NUMACT 1)
01700	   (PUTPROP 'ITEM (SETQ *ITEMS (LIST '*LIST '(PATTERN THING) 0)) '*INDEX)
01800	   (PUTPROP 'IF-NEEDED (SETQ *IF-NEEDEDS (LIST '*LIST '(PATTERN THING) 0)) '*INDEX)
01900	   (PUTPROP 'IF-ADDED (SETQ *IF-ADDEDS (LIST '*LIST '(PATTERN THING) 0)) '*INDEX)
02000	   (PUTPROP 'IF-REMOVED (SETQ *IF-REMOVEDS (LIST '*LIST '(PATTERN THING) 0)) '*INDEX)
02100	   (SSTATUS INTERRUPT 20. 'GCCON)
02200	   (PI-ON))
02300	  (COND ((> K 0)(ARG 1)) (T 100.))
02400	  (COND ((> K 1)(ARG 2)) (T 10.)) ))
     

00100	(DECLARE (UNSPECIAL PATTERN))
00200	
00300	(DEFUN FETCH N
00400	   (PROG (PATTERN CON)
00500	      (SETQ PATTERN (ARG 1)
00600	            CON (GETCONTEXT 1 N))      
00700	      (RETURN 
00800	          (CONS (LIST '*POSSIBILITIES PATTERN)
00900	                (CONS '*IGNORE
01000	                    (NCONC (FETCHI1 PATTERN CON) 
01100	                           (FETCHM1 PATTERN *IF-NEEDEDS CON)))))   ))
01200	
01300	
01400	
01500	(DEFUN FETCHI N
01600	    (CONS (LIST '*POSSIBILITIES (ARG 1))
01700	          (CONS '*IGNORE (FETCHI1 (ARG 1) (GETCONTEXT 1 N))))   )
01800	
01900	
02000	(DEFUN FETCHM N
02100	   (COND ((> N 3) (TMA))   )
02200	   ((LAMBDA (CON)
02300	      (CONS (LIST '*POSSIBILITIES (ARG 1))
02400	            (CONS '*IGNORE
02500		             (FETCHM1 (ARG 1) 
02600		                      (COND ((< N 2) *IF-NEEDEDS)
02700		                            ((GET (ARG 2) '*INDEX))   )
02800		                      CON)))   )
02900	    (COND ((< N 3) (/, CONTEXT))
03000	          ((ARG 3))   ))   )
03100	
03200	
03300	(DEFUN FETCHI1 (PATTERN CON)
03400	   (PROG (ALISTS)
03500	      (RETURN (MAPCAN '(LAMBDA (ITEM)
03600	                          (COND ((SETQ ALISTS (MATCH PATTERN (CAR ITEM)))
03700	                                 (LIST (LIST '*ITEM ITEM (CAR ALISTS)))) ))
03800	                      (SEARCH *ITEMS PATTERN T (CDR CON))))   ))
03900	
04000	
04100	(DEFUN FETCHM1 (PATTERN INDEX CON)
04200	   (MAPCAN '(LAMBDA (METHOD)
04300	              ((LAMBDA (MRESULT)
04400	                  (COND (MRESULT
04500	                         (LIST (CONS '*METHOD (CONS METHOD (NCONC MRESULT (LIST PATTERN))))))   ))
04600	               (MATCH (PATTERN METHOD) PATTERN)))
04700	           (SEARCH INDEX PATTERN NIL (CDR CON)))   )
04800	
04900	(DECLARE (SPECIAL PATTERN))
     

00100	(DEFUN REAL N (AND (REALITY (ARG 1) (GETCONTEXT 1 N)) (ARG 1))   )
00200	
00300	
00400	(DEFUN UNREAL N (AND (NOT (REALITY (ARG 1) (GETCONTEXT 1 N))) (ARG 1))   )
00500	
00600	
00700	(DEFUN PRESENT N
00800	   (PROG (CON PAT CANDIDATES ALISTS)
00900	      (SETQ PAT (ARG 1)
01000	            CON (GETCONTEXT 1 N)
01100	            CANDIDATES (SEARCH *ITEMS PAT T (CDR CON)))
01200	LOOP  (COND ((NULL CANDIDATES) (RETURN NIL))
01300	            ((SETQ ALISTS (MATCH PAT (ITEM (CAR CANDIDATES))))
01400	             (MAPC '(LAMBDA (PAIR)
01500	                         (CSET (CAR PAIR) (CADR PAIR)))
01600	                   (CAR ALISTS))
01700	             (RETURN (CAR CANDIDATES)))   )
01800	       (SETQ CANDIDATES (CDR CANDIDATES))
01900	       (GO LOOP)   ))
02000	
02100	
02200	(DEFUN ABSENT N
02300	    (UNREAL (DATUM (ARG 1)) (GETCONTEXT 1 N))   )
     

00100	(DECLARE (UNSPECIAL PATTERN))
00200	
00300	(DEFUN SEARCH (INDEX PATTERN ITEM CON)
00400	    (MAPCAN '(LAMBDA (THING)
00500	                (COND ((REALITY1 (CDR (CMARKERS THING)) 
00600	                                 CON) 
00700	                       (LIST THING))   ))
00800	             (ISEARCH INDEX PATTERN ITEM))   )
00900	
01000	(DECLARE (SPECIAL PATTERN))
01100	
01200	
01300	(DEFUN REALITY (DATUM CON)
01400	   (REALITY1 (CDR (CMARKERS DATUM)) (CDR CON)))
01500	
01600	
01700	(DEFUN REALITY1 (CMARKERS CFRAMES)
01800	   (PROG (CM CON)
01900	      (SETQ CON CFRAMES)
02000	LOOP  (COND ((SETQ CM (MFINTERSECT))
02100	             (OR (INVISIBLE (CADR CM) CON) (RETURN CM))
02200	             (SETQ CMARKERS (CDR CMARKERS) CFRAMES (CDR CFRAMES))
02300	             (GO LOOP))
02400	            ((RETURN NIL))   )   ))
02500	
02600	
02700	(DEFUN DATUM (SKELETON)
02800	   (PROG (CANDIDATES)
02900	      (SETQ CANDIDATES (ISEARCH *ITEMS SKELETON T))
03000	LOOP  (COND ((NULL CANDIDATES) (RETURN (LIST SKELETON)))
03100	            ((EQUAL (ITEM (CAR CANDIDATES)) SKELETON)
03200	             (RETURN (CAR CANDIDATES)))   )
03300	      (SETQ CANDIDATES (CDR CANDIDATES))
03400	      (GO LOOP)   ))(DEFUN ADD N (REALIZE (DATUMIZE (ARG 1)) (GETCONTEXT 1 N))   )
03500	
03600	
03700	(CDEFUN ADD (THING "OPTIONAL" (CONTEXT CONTEXT))
03800	   (REALIZE (/@ DATUMIZE (/, THING)) CONTEXT)   )
03900	
04000	
04100	(DEFUN REMOVE N (UNREALIZE (DATUMIZE (ARG 1)) (GETCONTEXT 1 N))   )
04200	
04300	
04400	(CDEFUN REMOVE (THING "OPTIONAL" (CONTEXT CONTEXT))
04500	   (UNREALIZE (/@ DATUMIZE (/, THING)) CONTEXT)   )
04600	
04700	
04800	(DEFUN INSERT N
04900	   ((LAMBDA (D)
05000	       (REVEAL D (GETCONTEXT 1 N)) D)
05100	    (DATUMIZE (ARG 1)))   )
05200	
05300	
05400	(DEFUN KILL N
05500	   ((LAMBDA (D)
05600	       (HIDE D (GETCONTEXT 1 N)) D)
05700	    (DATUMIZE (ARG 1)))   )
05800	
05900	
06000	(DEFUN ACTUALIZE N (REVEAL (ARG 1) (GETCONTEXT 1 N)) (ARG 1)   )
06100	
06200	
06300	(DEFUN UNACTUALIZE N (HIDE (ARG 1) (GETCONTEXT 1 N)) (ARG 1)   )(DECLARE (UNSPECIAL DATUM) (SPECIAL PAT CON))
06400	
06500	(DEFUN REALIZE N
06600	   (PROG (DATUM CON PAT)
06700	      (SETQ DATUM (ARG 1)
06800	            CON (GETCONTEXT 1 N))
06900	      (COND ((AND (REVEAL DATUM CON) (SETQ PAT (ITEM DATUM)))
07000	             (CEVAL '(CALLDEMONS (/@ . PAT) (/@ . *IF-ADDEDS) (/@ . CON))))   )
07100	      (RETURN DATUM)   ))
07200	
07300	
07400	(CDEFUN REALIZE (DATUM "OPTIONAL" (CONTEXT CONTEXT))
07500	   "AUX" (PAT)
07600	   (COND ((/@ AND (REVEAL (/, DATUM) (/, CONTEXT))
07700	                  (CSETQ PAT (ITEM (/, DATUM))))
07800	          (CALLDEMONS PAT (/@ . *IF-ADDEDS) CONTEXT))   )
07900	   DATUM)
08000	
08100	
08200	(DEFUN UNREALIZE N
08300	   (PROG (DATUM CON PAT)
08400	      (SETQ DATUM (ARG 1)
08500	            CON (GETCONTEXT 1 N))
08600	      (COND ((AND (HIDE DATUM CON) (SETQ PAT (ITEM DATUM)))
08700	             (CEVAL '(CALLDEMONS (/@ . PAT) (/@ . *IF-REMOVEDS) (/@ . CON))))   )
08800	      (RETURN DATUM)   ))
08900	
09000	
09100	(CDEFUN UNREALIZE (DATUM "OPTIONAL" (CONTEXT CONTEXT))
09200	   "AUX" (PAT)
09300	   (COND ((/@ AND (HIDE (/, DATUM) (/, CONTEXT))
09400	                  (CSETQ PAT (ITEM (/, DATUM))))
09500	          (CALLDEMONS PAT (/@ . *IF-REMOVEDS) CONTEXT))   )
09600	   DATUM)
09700	
09800	(DECLARE (SPECIAL DATUM) (UNSPECIAL PAT CON))(DEFUN CALLDEMONS (PAT INDEX CONTEXT)
09900	   (CINTERRUPT (LIST 'RUNDAEMONS
10000	                     PAT
10100	                     CONTEXT
10200	                     (SEARCH INDEX PAT NIL (CDR CONTEXT)))))
10300	
10400	(CDEFUN RUNDAEMONS ('PAT 'CONTEXT 'METS)
10500	   (ALLOW T)
10600	   (/: TLP)
10700	   (COND (METS (INVOKE (NXTMET) PAT) (GO 'TLP))))
10800	
10900	(DEFUN NXTMET FEXPR (L)
11000	   (PROG2 (SETQ L (CDR (VLOC 'METS))) (CAAR L) (RPLACA L (CDAR L))))
     

00100	(DEFUN REVEAL (DATUM CON)
00200	   (PROG (CM STATUS CMARKERS CFRAMES PATTERN CNUM CFRAME NEW TYPE NUM)
00300	      (PI-OFF)
00400	      (SETQ CMARKERS (ANALYZE DATUM)
00500	            CFRAMES (SETQ CON (CDR CON))
00600	            CM (ADDCFRAME (SETQ CFRAME (CAR CON)) CMARKERS)
00700	            CNUM (CADR CFRAME)
00800	            STATUS (CADR CM))
00900	      (RPLACA (CDR CM) '/+)
01000	      (COND (STATUS (PI-ON) (RETURN NIL))
01100	            ((AND PATTERN NEW (NULL (CDDR CMARKERS)))
01200	             (INDEX DATUM PATTERN (GET TYPE '*INDEX)))   )
01300	      (SETQ CMARKERS (CDDR CMARKERS) CFRAMES (CDR CFRAMES))
01400	LOOP  (COND ((SETQ CM (MFINTERSECT))
01500	             (COND ((SETQ NUM (INVISIBLE (CADR CM) CON))
01600	                    (COND ((EQUAL CNUM NUM)
01700	                           (SETQ NEW NIL)
01800	                           (RPLACA (CDR CM) (OR (DELETE CNUM (CADR CM) 1) '/+)))   ))
01900	                   ((SETQ STATUS T))   )
02000	             (SETQ CMARKERS (CDR CMARKERS) CFRAMES (CDR CFRAMES))
02100	             (GO LOOP))
02200	            (NEW (RPLACD (CDR CFRAME) (CONS DATUM (CDDR CFRAME))))   )
02300	      (PI-ON)
02400	      (RETURN (NOT STATUS))   ))
02500	
02600	
02700	(DEFUN HIDE (DATUM CON)
02800	   (PROG (PATTERN CFRAMES CMARKERS CNUM STATUS NUM TYPE REM OLD CFRAME CM)
02900	      (SETQ CFRAMES (SETQ CON (CDR CON))
03000	            CMARKERS (ANALYZE DATUM)
03100	            CNUM (CADAR CON))
03200	      (PI-OFF)
03300	      (COND ((SETQ CM (FINDCFRAME (SETQ CFRAME (CAR CFRAMES))
03400	                                  (CDR CMARKERS)))
03500	             (SETQ STATUS (CADR CM) OLD T)
03600	             (COND ((CDDR CM)
03700	                    (RPLACA (CDR CM) NIL))
03800	                   ((SETQ REM T)
03900	                    (DELQ CM CMARKERS 1)
04000	                    (AND PATTERN
04100	                         (NULL (CDR CMARKERS))
04200	                         (UNINDEX DATUM PATTERN (GET TYPE '*INDEX) (EQ TYPE 'ITEM))))   ))   )
04300	      (SETQ CMARKERS (CDR CMARKERS))
04400	LOOP  (COND ((SETQ CM (MFINTERSECT))
04500	             (COND ((SETQ NUM (INVISIBLE (CADR CM) CON))
04600	                    (COND (REM (SETQ REM (NOT (EQUAL CNUM NUM))))
04700	                          ((OR OLD (SETQ OLD (EQUAL CNUM NUM))))   ))
04800	                   ((SETQ REM NIL STATUS T)
04900	                    (CANCEL CM CNUM))   )
05000	             (SETQ CMARKERS (CDR CMARKERS) CFRAMES (CDR CFRAMES))
05100	             (GO LOOP))
05200	            (REM
05300	             (RPLACD (CDR CFRAME) (DELQ DATUM (CDDR CFRAME) 1)))
05400	            ((AND STATUS (NOT OLD))
05500	             (RPLACD (CDR CFRAME) (CONS DATUM (CDDR CFRAME))))   )
05600	      (PI-ON)
05700	      (RETURN STATUS)   ))(DEFUN ADDCFRAME (CFRAME CMARKERS)
05800	   (PROG (N)
05900	      (SETQ N (CADR CFRAME))
06000	LOOP  (COND ((OR (NULL (CDR CMARKERS)) (LESSP (CAADR CMARKERS) N))
06100	             (RPLACD CMARKERS (CONS (LIST N NIL) (CDR CMARKERS)))
06200	             (SETQ NEW T))
06300	            ((EQ N (CAADR CMARKERS)))
06400	            (T (SETQ CMARKERS (CDR CMARKERS)) (GO LOOP))   )
06500	      (RETURN (CADR CMARKERS))   ))
06600	
06700	
06800	
06900	(DEFUN FINDCFRAME (CFRAME CMARKERS)
07000	   (PROG (NF NM)
07100	      (SETQ NF (CADR CFRAME))
07200	LOOP  (COND ((NULL CMARKERS) (RETURN NIL))
07300	            ((> NF (SETQ NM (CAAR CMARKERS)))
07400	             (RETURN NIL))
07500	            ((> NM NF)
07600	             (SETQ CMARKERS (CDR CMARKERS))
07700	             (GO LOOP))
07800	            ((RETURN (CAR CMARKERS)))   )   ))
07900	
08000	
08100	(DEFUN CANCEL (CM NUM)
08200	   (RPLACA (CDR CM) (MERGEN NUM (CADR CM)))   )
08300	
08400	
08500	(DEFUN MERGEN (N NL)
08600	   (COND ((ATOM NL) (LIST N))
08700	         ((> N (CAR NL)) (CONS N NL))
08800	         ((RPLACD NL (MERGEN N (CDR NL))))   ))(DEFUN DPUTCF (DATUM PROPERTY INDICATOR CFRAME)
08900	   (PROG (PATTERN TYPE CM TAIL NEW)
09000	      (PI-OFF)
09100	      (SETQ TAIL (ANALYZE DATUM)
09200	            CM (ADDCFRAME CFRAME TAIL))
09300	      (COND (NEW
09400	             (RPLACD (CDR CFRAME) (CONS DATUM (CDDR CFRAME)))
09500	             (AND PATTERN (NULL (CDDR TAIL)) (INDEX DATUM PATTERN (GET TYPE '*INDEX))))   )
09600	      (PI-ON)
09700	      (RETURN (DPUT1 CM PROPERTY INDICATOR))   ))
09800	
09900	
10000	(DEFUN DGETCF (DATUM INDICATOR CFRAME)
10100	   (ASSQ INDICATOR (FINDCFRAME CFRAME (CDR (CMARKERS DATUM))))   )
10200	
10300	
10400	(DEFUN DREMCF (DATUM INDICATOR CFRAME)
10500	   (PROG (CMARKERS PATTERN TYPE CM PAIR)
10600	      (SETQ CMARKERS (ANALYZE DATUM)
10700	            CM (FINDCFRAME CFRAME (CDR CMARKERS)))
10800	      (COND ((AND CM (SETQ PAIR (ASSQ INDICATOR (CDDR CM))))
10900	             (PI-OFF)
11000	             (DELQ PAIR (CDR CM) 1)
11100	             (COND ((NOT (OR (CADR CM) (CDDR CM)))
11200	                    (DELQ CM CMARKERS 1)
11300	                    (DELQ DATUM CFRAME 1))   )
11400	             (COND ((AND PATTERN
11500	                         (NULL (CDR CMARKERS)))
11600	                    (UNINDEX DATUM PATTERN (GET TYPE '*INDEX) (EQ TYPE 'ITEM)))   )
11700	             (PI-ON)
11800	             (RETURN PAIR))   )   ))
     

00100	(DEFUN DPUT N
00200	   (DPUTCF (ARG 1) (ARG 2) (ARG 3) (CADR (GETCONTEXT 3 N)))   )
00300	
00400	
00500	(DEFUN DGET N
00600	   ((LAMBDA (CONTEXT)
00700	       (DGET1 (CDR (CMARKERS (ARG 1))) (ARG 2) (CDR CONTEXT) NIL))
00800	    (GETCONTEXT 2 N))   )
00900	
01000	
01100	(DEFUN DREM N
01200	   (DREM1 (ARG 1) (ARG 2) (CDR (GETCONTEXT 2 N)) NIL)   )(DEFUN DPUT+ N
01300	   ((LAMBDA (CM)
01400	       (COND (CM (DPUT1 CM (ARG 2) (ARG 3)))
01500	             ((CERR ABSENT DATUM))   ))
01600	    (REALITY (ARG 1) (GETCONTEXT 3 N)))   )
01700	
01800	
01900	(DEFUN DGET+ N
02000	   (DGET1 (CDR (CMARKERS (ARG 1))) (ARG 2) (CDR (GETCONTEXT 2 N)) T)   )
02100	
02200	
02300	(DEFUN DREM+ N
02400	   (DREM1 (ARG 1) (ARG 2) (CDR (GETCONTEXT 2 N)) T)   )
02500	
02600	
02700	
02800	
     

00100	(DEFUN DPUT1 (CM PROPERTY INDICATOR)
00200	   (PROG (PAIR)
00300	      (COND ((SETQ PAIR (ASSQ INDICATOR (CDDR CM)))
00400	             (RPLACA (CDR PAIR) PROPERTY))
00500	            ((RPLACD (CDR CM)
00600	                     (CONS (SETQ PAIR (LIST INDICATOR PROPERTY))
00700	                           (CDDR CM))))   )
00800	      (RETURN PAIR)   ))
00900	
01000	
01100	(DEFUN DGET1 (CMARKERS INDICATOR CFRAMES SIGN)
01200	   (PROG (PAIR CM CON)
01300	      (SETQ CON CFRAMES)
01400	LOOP  (COND ((NULL (SETQ CM (MFINTERSECT)))
01500	             (RETURN NIL))
01600	            ((AND SIGN (INVISIBLE (CADR CM) CON)))
01700	            ((SETQ PAIR (ASSQ INDICATOR (CDDR CM)))
01800	             (RETURN PAIR))   )
01900	      (SETQ CMARKERS (CDR CMARKERS)
02000	            CFRAMES (CDR CFRAMES))
02100	      (GO LOOP))   )
02200	
02300	
02400	(DEFUN DREM1 (DATUM INDICATOR CFRAMES SIGN)
02500	   (PROG (PAIR CMARKERS TAIL PATTERN TYPE CM CON)
02600	      (SETQ CON CFRAMES
02700	            CMARKERS (CDR (SETQ TAIL (ANALYZE DATUM))))
02800	LOOP  (COND ((NULL (SETQ CM (MFINTERSECT)))
02900	             (RETURN NIL))
03000	            ((AND SIGN (INVISIBLE (CADR CM) CON)))
03100	            ((SETQ PAIR (ASSQ INDICATOR (CDDR CM)))
03200	             (PI-OFF)
03300	             (DELQ PAIR (CDR CM))
03400	             (COND ((NOT (OR (CADR CM) (CDDR CM)))
03500	                    (DELQ CM TAIL)
03600	                    (DELQ DATUM (CAR CFRAMES)))   )
03700	             (COND ((AND PATTERN (NULL (CDR TAIL)))
03800	                    (UNINDEX DATUM PATTERN (GET TYPE '*INDEX) (EQ TYPE 'ITEM)))   )
03900	             (PI-ON)
04000	             (RETURN PAIR))   )
04100	      (SETQ CMARKERS (CDR CMARKERS)
04200	            CFRAMES (CDR CFRAMES))
04300	      (GO LOOP)   ))
04400	
     

00100	(DEFUN MENTIONERS N
00200	   (PROG (CFRAMES CMARKERS MENTIONERS SIGN CM CON)
00300	      (COND ((< N 1) (TFA))   )
00400	      (SETQ CFRAMES (CDR (COND ((< N 3) (/, CONTEXT))
00500	                               ((= N 3) (ARG 3))
00600	                               ((TMA))   ))
00700	            SIGN (COND ((> N 1) (ARG 2))   )
00800	            CMARKERS (CDR (CMARKERS (ARG 1)))
00900	            CON CFRAMES)
01000	LOOP  (COND ((SETQ CM (MFINTERSECT))
01100	             (OR (AND SIGN (INVISIBLE (CADR CM) CON))
01200	                 (SETQ MENTIONERS (CONS (CAR CFRAMES) MENTIONERS)))
01300	             (SETQ CFRAMES (CDR CFRAMES)
01400	                   CMARKERS (CDR CMARKERS))
01500	             (GO LOOP))   )
01600	      (RETURN (REVERSE MENTIONERS))   ))
01700	
01800	
01900	(DECLARE (UNSPECIAL DATUM))
02000	
02100	(DEFUN C-MARKER (DATUM CFRAME)
02200	   (FINDCFRAME CFRAME (CDR (CMARKERS DATUM)))   )
02300	
02400	(DECLARE (SPECIAL DATUM))(DEFUN MFINTERSECT ()
02500	   (PROG (NM NF CM)
02600	ADVANCE
02700	      (COND ((AND CMARKERS CFRAMES)
02800	             (SETQ NF (CADAR CFRAMES)
02900	                   CM (CAR CMARKERS)
03000	                   NM (CAR CM)))
03100	            ((RETURN NIL))   )
03200	TEST  (COND ((> NF NM)
03300	             (OR (SETQ CFRAMES (CDR CFRAMES))
03400	                 (RETURN NIL))
03500	             (SETQ NF (CADAR CFRAMES))
03600	             (GO TEST))
03700	            ((> NM NF)
03800	             (OR (SETQ CMARKERS (CDR CMARKERS))
03900	                 (RETURN NIL))
04000	             (SETQ CM (CAR CMARKERS)
04100	                   NM (CAR CM))
04200	             (GO TEST))
04300	            ((RETURN CM))   )   ))
04400	
04500	(DECLARE (UNSPECIAL CMARKERS))
04600	
04700	
04800	(DEFUN INVISIBLE (CNUMS CFRAMES)
04900	   (AND (NOT (EQ CNUMS '/+))
05000	        (OR (NULL CNUMS)
05100	            (PROG (NC NF)
05200	               (SETQ NC (CAR CNUMS))
05300	         LOOP  (COND (CFRAMES
05400	                      (SETQ NF (CADAR CFRAMES) CFRAMES (CDR CFRAMES)))
05500	                     ((RETURN NIL))   )
05600	         TEST  (COND ((> NF NC) (GO LOOP))
05700	                     ((> NC NF)
05800	                      (OR (SETQ CNUMS (CDR CNUMS)) (RETURN NIL))
05900	                      (SETQ NC (CAR CNUMS))
06000	                      (GO TEST))
06100	                     ((RETURN NC))   )   )))   )
06200	
06300	(DECLARE (UNSPECIAL CFRAMES))
06400	
06500	
06600	(DEFUN GETCONTEXT (K N)
06700	   (COND ((< N K) (TFA))
06800	         ((= N K) (/, CONTEXT))
06900	         ((= N (SETQ K (ADD1 K))) (ARG K))
07000	         ((TMA))   ))(DECLARE (UNSPECIAL PATTERN))
07100	
07200	(DEFUN ISEARCH (INDEX PATTERN ITEM)
07300	   (APPLY 'APPEND (CDR (ISEARCH1 INDEX PATTERN ITEM)))   )
07400	
07500	
07600	(DEFUN ISEARCH1 (INDEX PATTERN ITEM)
07700	   (PROG (ASCAR ASCDR)
07800	      (COND ((NULL INDEX) (RETURN (LIST 0)))
07900	            ((EQ (CAR INDEX) '*LIST)
08000	             (RETURN (CONS (CADDR INDEX) (LIST (CDDDR INDEX)))))
08100	            ((EQ (CAR INDEX) '*INDEX))
08200	            (T (BREAK BAD-STRUCTURE-INDEX--ISEARCH T))   )
08300	      (RETURN (COND ((OR
08400	                      (ZEROP (CAR (SETQ ASCAR 
08500	                                        (ASEARCH (CADDR INDEX) (CAR PATTERN) ITEM))))
08600	                      (NULL (CDR PATTERN))
08700	                      (> (CAR (SETQ ASCDR
08800	                                    (ASEARCH (CDDDR INDEX) (CDR PATTERN) ITEM)))
08900	                         (CAR ASCAR)))
09000	                     ASCAR)
09100	                    (ASCDR)   ))   ))
09200	
09300	
09400	(DEFUN ASEARCH (SUBINDEX ELEMENT ITEM)
09500	   (PROG (INDICATOR ASSOCIATION CLLIST VLIST)
09600	      (COND ((EQ (SETQ INDICATOR (ATOMIZE ELEMENT)) '*VARIABLE)
09700	             (RETURN (LIST 10000)))   )
09800	      (SETQ CLLIST
09900	            (COND ((EQ INDICATOR '*STRUCTURE)
10000	                   (ISEARCH1 (CAR SUBINDEX) ELEMENT ITEM))
10100	                  ((SETQ ASSOCIATION (ASSQ1 INDICATOR (CDR SUBINDEX)))
10200	                   (CONS (CADR ASSOCIATION) (LIST (CDDR ASSOCIATION))))
10300	                  ((LIST 0))   ))
10400	      (COND ((AND (NOT ITEM)
10500	                  (SETQ ASSOCIATION (ASSQ '*VARIABLE (CDR SUBINDEX)))
10600	                  (SETQ VLIST (CDDR ASSOCIATION)))
10700	             (RPLACA CLLIST (/+ (CAR CLLIST) (CADR ASSOCIATION)))
10800	             (RPLACD CLLIST (CONS VLIST (CDR CLLIST))))   )
10900	      (RETURN CLLIST)   ))
11000	
11100	
11200	(DEFUN ASSQ1 (IND ALIST)
11300	   (COND ((NUMBERP IND) (ASSOC IND ALIST))
11400	         ((ASSQ IND ALIST))   ))(DECLARE (SPECIAL THING PFORM INDEX))
11500	
11600	(DEFUN INDEX (THING PATTERN INDEX)
11700	   (PROG (NUM THINGS PFORM)
11800	      (COND ((NULL INDEX) (BREAK BAD-INDEX--INDEX T))
11900	            ((EQ (CAR INDEX) '*LIST)
12000	             (COND ((EQUAL (SETQ NUM (ADD1 (CADDR INDEX)))
12100	                           *INDEXTHRESHOLD)
12200	                    (RPLACA INDEX '*INDEX)
12300	                    (SETQ THINGS (CDDDR INDEX) PFORM (CADR INDEX))
12400	                    (RPLACD (CDR INDEX) (LIST (LIST NIL) NIL))
12500	                    (MAPC
12600	                     (/!" LAMBDA (THING)
12700	                          (INDEX THING (/@ .  PFORM) INDEX))
12800	                     THINGS))
12900	                   (T (RPLACD (CDR INDEX)
13000	                              (CONS NUM
13100	                                    (CONS THING (CDDDR INDEX))))
13200	                      (RETURN THING))   ))
13300	            ((EQ (CAR INDEX) '*INDEX)
13400	             (SETQ PFORM (CADR INDEX)))
13500	            ((BREAK BAD-INDEX--INDEX T))   )
13600	      (INDEX1 THING (CAR PATTERN) (CADDR INDEX) 'CAR PFORM)
13700	      (AND (CDR PATTERN)
13800	           (INDEX1 THING (CDR PATTERN) (CDDDR INDEX) 'CDR PFORM))
13900	      (RETURN THING)   ))
14000	
14100	(DECLARE (UNSPECIAL PFORM INDEX))
14200	
14300	
14400	(DEFUN UNINDEX (THING PATTERN INDEX ITEM)
14500	   (COND ((NULL INDEX) (BREAK BAD-INDEX--UNINDEX T))
14600	         ((EQ (CAR INDEX) '*LIST)
14700	          (RPLACD (CDR INDEX)
14800	                  (CONS (SUB1 (CADDR INDEX))
14900	                        (DELTHING THING (CDDDR INDEX) ITEM)))
15000	          THING)
15100	         ((EQ (CAR INDEX) '*INDEX)
15200	          (UNINDEX1 THING (CAR PATTERN) (CADDR INDEX) ITEM)
15300	          (AND (CDR PATTERN)
15400	               (UNINDEX1 THING (CDR PATTERN) (CDDDR INDEX) ITEM))
15500	          THING)
15600	         ((BREAK BAD-INDEX--UNINDEX T))   ))
15700	
15800	(DECLARE (UNSPECIAL THING))
15900	
16000	
16100	(DEFUN INDEX1 (THING ELEMENT SUBINDEX POS PFORM)
16200	   (PROG (INDICATOR ASSOCIATION)
16300	      (COND ((EQ (SETQ INDICATOR (ATOMIZE ELEMENT)) '*STRUCTURE)
16400	             (COND ((NULL (CAR SUBINDEX))
16500	                    (RPLACA SUBINDEX (LIST '*LIST (LIST POS PFORM) 0)))   )
16600	             (INDEX THING ELEMENT (CAR SUBINDEX)))
16700	            ((SETQ ASSOCIATION (ASSQ1 INDICATOR (CDR SUBINDEX)))
16800	             (RPLACD ASSOCIATION
16900	                     (CONS (ADD1 (CADR ASSOCIATION))
17000	                           (CONS THING (CDDR ASSOCIATION)))))
17100	            (T (RPLACD SUBINDEX
17200	                        (CONS (LIST INDICATOR 1 THING)
17300	                              (CDR SUBINDEX))))   )   ))
17400	
17500	
17600	(DEFUN UNINDEX1 (THING ELEMENT SUBINDEX ITEM)
17700	   (PROG (ASSOCIATION INDICATOR NUM)
17800	      (SETQ INDICATOR (ATOMIZE ELEMENT))
17900	      (COND ((EQ INDICATOR '*STRUCTURE)
18000	             (UNINDEX THING ELEMENT (CAR SUBINDEX) ITEM))
18100	            ((SETQ ASSOCIATION (ASSQ1 INDICATOR (CDR SUBINDEX)))
18200	             (COND ((ZEROP (SETQ NUM (SUB1 (CADR ASSOCIATION))))
18300	                    (DELQ ASSOCIATION SUBINDEX))
18400	                   (T (RPLACD ASSOCIATION
18500	                              (CONS NUM 
18600	                                    (DELTHING THING (CDDR ASSOCIATION) ITEM))))   ))   )   ))(DECLARE (SPECIAL PATTERN))
18700	
18800	(DEFUN ANALYZE (X)
18900	   (COND ((NULL X)
19000	          (CERR MEANINGLESS DATUM -- ANALYZE))
19100	         ((ATOM X)
19200	          (ANALYZE (GET X 'DATUM)))
19300	         ((EQ (CAR X) '*CLOSURE)
19400	          (PROG2 (ANALYZE (CADR X)) (CDDR X) (SETQ DATUM X)))
19500	         ((EQ (CAR X) '*OBJECT)
19600	          (SETQ PATTERN NIL TYPE 'OBJECT)
19700	          (CDR X))
19800	         ((ATOM (SETQ TYPE (CAR X)))
19900	          (SETQ PATTERN (CADDR X))
20000	          (AND (CADR X) (SETQ DATUM (CADR X)))
20100	          (CDDDR X))
20200	         (T (SETQ PATTERN (CAR X) TYPE 'ITEM)
20300	            X)   ))
20400	
20500	(DECLARE (UNSPECIAL PATTERN))
20600	
20700	(DEFUN CMARKERS (DATUM)
20800	   (COND ((NULL DATUM)
20900	          (CERR MEANINGLESS DATUM -- CMARKERS))
21000	         ((ATOM DATUM)
21100	          (CMARKERS (GET DATUM 'DATUM)))
21200	         ((EQ (CAR DATUM) '*CLOSURE)
21300	          (CDDR DATUM))
21400	         ((EQ (CAR DATUM) '*OBJECT)
21500	          (CDR DATUM))
21600	         ((ATOM (CAR DATUM))
21700	          (CDDDR DATUM))
21800	         (DATUM)   ))
21900	
22000	
22100	(DEFUN PATTERN (DATUM)
22200	   (COND ((NULL DATUM)
22300	          (CERR MEANINGLESS DATUM -- PATTERN))
22400	         ((ATOM DATUM)
22500	          (PATTERN (GET DATUM 'DATUM)))
22600	         ((EQ (CAR DATUM) '*CLOSURE)
22700	          (PATTERN (CADR DATUM)))
22800	         ((ATOM (CAR DATUM))
22900	          (CADDR DATUM))
23000	         ((CAR DATUM))   ))
23100	
23200	
23300	(DEFUN NTH (EXP N)
23400	   (COND ((= N 1) (CAR EXP))
23500	         ((NTH (CDR EXP) (SUB1 N)))   ))(DEFUN DELTHING (THING LIST ITEM)
23600	   (COND (ITEM
23700	          (DELITEM (ITEM THING) LIST))
23800	         ((DELQ THING LIST 1))   ))
23900	
24000	
24100	(DEFUN DELITEM (EXP LIST)
24200	   (COND ((NULL LIST) NIL)
24300	         ((EQUAL EXP (ITEM (CAR LIST)))
24400	          (CDR LIST))
24500	         (T (RPLACD LIST (DELITEM EXP (CDR LIST))))   ))
24600	
24700	
24800	(DEFUN MEMCAR (EXP LIST)
24900	   (COND ((NULL LIST) NIL)
25000	         ((EQUAL EXP (ITEM (CAR LIST)))
25100	          LIST)
25200	         (T (MEMCAR EXP (CDR LIST)))   ))
25300	
25400	
25500	(DEFUN ITEM (DATUM)
25600	   (COND ((NULL DATUM) (CERR MEANINGLESS DATUM))
25700	         ((ATOM DATUM) (ITEM (GET DATUM 'DATUM)))
25800	         (((LAMBDA (PAT) (AND (NOT (ATOM PAT)) PAT)) (CAR DATUM)))   ))
25900	
26000	(DEFUN DATUMIZE (THING) (COND ((ATOM THING) THING) ((DATUM THING))   ))
26100	
26200	(DEFUN ATOMIZE (ELEMENT)
26300	   (COND ((ATOM ELEMENT) ELEMENT)
26400	         ((ACTOR (CAR ELEMENT)) '*VARIABLE)
26500	         (T '*STRUCTURE)   ))
     

00100	(DEFUN PUSH-CONTEXT N
00200	    (CONS '*CONTEXT (CONS (CFRAME) (CDR (GETCONTEXT 0 N)))))
00300	
00400	
00500	(DEFUN POP-CONTEXT N
00600	    (CONS '*CONTEXT (CDDR (GETCONTEXT 0 N))))
00700	
00800	
00900	(DECLARE (UNSPECIAL CFRAMES))
01000	
01100	(DEFUN NEW-CONTEXT (CFRAMES)
01200	   (COND ((ORDERED CFRAMES)
01300	          (CONS '*CONTEXT CFRAMES))
01400	         ((CERR UNORDERED CONTEXT))   ))
01500	
01600	(DECLARE (SPECIAL CFRAMES))
01700	
01800	
01900	(DEFUN SPLICE (CONTEXT)
02000	   (RPLACD (CDR CONTEXT)
02100	           (CONS (CFRAME (NEWCNUM (CADR (CADDR CONTEXT))
02200	                                  (CADADR CONTEXT)))
02300	                 (CDDR CONTEXT)))
02400	   CONTEXT)
02500	
02600	
02700	(DECLARE (SPECIAL EXPR))
02800	
02900	(DEFUN IN-CONTEXT (CONTEXT EXPR)
03000	   (CEVAL '((CLAMBDA (CONTEXT) (CEVAL (/@ . EXPR))) (/@ .CONTEXT)))   )
03100	(DECLARE (UNSPECIAL EXPR))
03200	
03300	
03400	(CDEFUN IN-CONTEXT (CONTEXT EXPR)
03500	   (CEVAL EXPR)   )
03600	
03700	
03800	(DEFUN PATH (C) (CONS '*CONTEXT (MAPCAR 'CADR (CDR C)))   ) (DEFUN CFRAME K
03900	   ((LAMBDA (NFRAME)
04000	       (COND ((AND (= NUMACT NUMCON)(= (GCCON) NUMCON))
04100	              (CERR TOO MANY CONTEXT-FRAMES))   )
04200	       (PI-OFF)
04300	       (STORE (FRAMES NUMACT) NFRAME)
04400	       (STORE (RFRAMES NUMACT) (CDR NFRAME))
04500	       (SETQ NUMACT (ADD1 NUMACT))
04600	       (PI-ON)
04700	       NFRAME)
04800	    (LIST '*CFRAME (COND ((ZEROP K) (SETQ *CNUM (PLUS INCCON *CNUM)))
04900	                         (T (ARG 1))   )))   )
05000	
05100	
05200	(DEFUN ORDERED (CLIST)
05300	   (OR (NULL CLIST)
05400	       (PROG NIL
05500	    LOOP  (COND ((CDR CLIST)
05600	                 (OR (< (CADADR CLIST) (CADAR CLIST))
05700	                     (RETURN NIL))
05800	                 (SETQ CLIST (CDR CLIST))
05900	                 (GO LOOP))   )
06000	          (RETURN T)))   )
06100	
06200	
06300	(DEFUN NEWCNUM (LOW HIGH)
06400	   (PROG (N INC INUSE)
06500	      (SETQ N (// (PLUS LOW HIGH) 2)
06600	            INUSE (CNUMSINUSE LOW HIGH)
06700	            INC 1)
06800	LOOP  (COND ((GREATERP HIGH N LOW)
06900	             (COND ((MEMBER N INUSE)
07000	                    (SETQ N (PLUS N INC)
07100	                          INC (DIFFERENCE 0 (ADD1 INC)))
07200	                    (GO LOOP))
07300	                   ((RETURN N))   ))
07400	            ((CERR NO NEW CNUM BETWEEN (* LOW) AND (* HIGH)))   )   ))
07500	
07600	
07700	(DEFUN CNUMSINUSE (LOW HIGH)
07800	  (PROG (I NUMS J N)
07900	      (SETQ I 0 J (SUB1 NUMACT))
08000	LOOP  (COND ((> I J) (RETURN NUMS))
08100	            ((OR (> LOW (SETQ N (CAR (RFRAMES I))))
08200	                 (> N HIGH)))
08300	            ((SETQ NUMS (CONS N NUMS)))   )
08400	      (SETQ I (ADD1 I))
08500	      (GO LOOP)   ))(DEFUN *GCCON () (PROG (M N)
08600	   (SETQ N 0   M NUMACT)
08700	 
08800	NGCLP
08900	   (COND ((= M N) (RETURN N))
09000	         ((EQ (CDR (FRAMES N)) (RFRAMES N))
09100	          (SETQ N (ADD1 N)) (GO NGCLP)))
09200	
09300	   (FLUSH (RFRAMES N))
09400	   (STORE (RFRAMES N) 0)
09500	
09600	 MGCLP
09700	   (SETQ M (SUB1 M))
09800	   (COND ((= M N) (RETURN N))
09900	         ((EQ (CDR (FRAMES M)) (RFRAMES M)) (GO EXCH)))
10000	   (FLUSH (RFRAMES M))
10100	   (STORE (RFRAMES M) 0)
10200	   (GO MGCLP)
10300	
10400	 EXCH
10500	   (STORE (FRAMES N) (FRAMES M))
10600	   (STORE (RFRAMES N) (RFRAMES M))
10700	   (STORE (RFRAMES M) 0)
10800	   (GO NGCLP)))
10900	
11000	
11100	(DEFUN GCCON FEXPR (L)
11200	   (PI-OFF)
11300	   (SETQ L (SETQ NUMACT (*GCCON)))
11400	   (PI-ON)
11500	   L)
11600	
11700	(DECLARE (SPECIAL PATTERN))
11800	
11900	(DEFUN FLUSH (CFRAME)
12000	   (PROG (THING THINGS N PATTERN TYPE CMARKERS)
12100	      (SETQ THINGS (CDR CFRAME) N (CAR CFRAME))
12200	LOOP  (COND ((NULL THINGS)
12300	             (RETURN NIL))   )
12400	      (COND ((AND (REMCFRAME N
12500	                             (SETQ CMARKERS (ANALYZE (SETQ THING (CAR THINGS)))))
12600	                  PATTERN
12700	                  (NULL (CDR CMARKERS)))
12800	             (UNINDEX THING
12900	                      PATTERN
13000	                      (GET TYPE '*INDEX)
13100	                      (EQ TYPE 'ITEM)))   )
13200	      (SETQ THINGS (CDR THINGS))
13300	      (GO LOOP)   ))
13400	
13500	(DECLARE (UNSPECIAL PATTERN))
     

00100	(DEFUN REMCFRAME (N CMARKERS)
00200	   (PROG (M CM)
00300	LOOP1 (COND ((NULL (CDR CMARKERS))
00400	             (RETURN NIL))
00500	            ((= N (SETQ M (CAADR CMARKERS)))
00600	             (RPLACD CMARKERS (CDDR CMARKERS))
00700	             (RETURN T))
00800	            ((> N M)
00900	             (SETQ CMARKERS (CDR CMARKERS))
01000	             (GO LOOP1))   )
01100	LOOP2 (SETQ CMARKERS (CDR CMARKERS))
01200	      (COND ((NULL CMARKERS) (RETURN NIL))
01300	            ((ATOM (CADR (SETQ CM (CAR CMARKERS))))
01400	             (AND (MEMBER N (CADR CM))
01500	                  (RPLACA (CDR CM)
01600	                          (OR (DELETE N (CADR CM) 1) '/+))))   )
01700	      (GO LOOP2)   ))
01800	
01900	
02000	(DEFUN /!" FEXPR (L) (/!"1 L))
02100	
02200	
02300	(DEFUN /!"1 (L)
02400	 (COND ((ATOM L) L)
02500	       ((EQ (CAR L) '/@) (EVAL (CDR L)))
02600	       ((EQ (CAR L) '/,) (IVAL (CADR L) '*TOP))
02700	       ((ATOM (CAR L)) (CONS (CAR L) (/!"1 (CDR L))))
02800	       ((EQ (CAAR L) '/!/@) (APPEND (EVAL (CDAR L))(/!"1 (CDR L))))
02900	       (T (CONS (/!/"1 (CAR L)) (/!"1 (CDR L)))))   )